<?php
/**
 * 下划线命名改驼峰法命名
 * @param $str
 * @return mixed|string
 */
function str_change_t($str){
    if(strpos('_',$str))
	$str = str_replace ('_', ' ', $str); 
	$str = ucwords ($str); //将每个单词的手写字母转为大写 
	$str = str_replace (' ', '', $str);
	return $str; 
}

/**
 * 驼峰命名转下划线
 * @param $str
 * @return string
 */
function str_change_x($str){
    $str = strtolower(preg_replace('/((?<=[a-z])(?=[A-Z]))/', '_', $str));
    return $str;
}

/**
 * 检测验证码
 * @param  integer $id 验证码类型ID
 * @return boolean 检测结果
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function check_verify($code, $id = ''){
	$verify = new \Think\Verify();
	return $verify->check($code, $id);
}


/**
 * 系统非常规MD5加密方法
 * @param  string $str 要加密的字符串
 * @return string 
 */
function strengthen_md5($str, $key = 'xxycms'){
	return '' === $str ? '' : md5(sha1($str) . $key);
}

/**
 * 模拟get请求
 * Enter description here ...
 * @param unknown_type $url 请求地址
 * @param unknown_type $options 批量设置cURL传输选项
 */
function curl_get($url='', $options=array()){
	//初始化curl模块
    $ch = curl_init($url);
    
    //是否自动显示返回的信息
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
    //最大等待时间
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    
    //终止从服务端进行验证cURL
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    
    //1 检查服务器SSL证书中是否存在一个公用名(common name)。译者注：公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。2 检查公用名是否存在，并且是否与提供的主机名匹配。 
	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
	
	//是否批量设置cURL传输选项
    if (!empty($options)){
        curl_setopt_array($ch, $options);
    }
    $data = curl_exec($ch);
    if ($data===false) {
    	return false;
//    	$data=curl_error($ch);
    }
    curl_close($ch);
    return $data;
}


/**
 * 模拟post请求
 * Enter description here ...
 * @param unknown_type $url 请求地址
 * @param unknown_type $postdata 要提交的数据
 * @param unknown_type $options 批量设置cURL传输选项
 */
function curl_post($url='', $postdata='', $options=array()){
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_TIMEOUT, 25);
    if (!empty($options)){
        curl_setopt_array($ch, $options);
    }
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}

/**
 * 根据IP返回对应地址信息
 * Enter description here ...
 * @param string $ip 要解析的IP
 * return array
 */
function getIP($ip){
	$Ip = new Org\Net\IpLocation('UTFWry.dat'); // 实例化类 参数表示IP地址库文件
	$area = $Ip->getlocation($ip); // 获取某个IP地址所在的位置
	return $area;
}


//特殊字符过滤
function strFilter($code) {
	$code=strip_tags($code,"<br>");
	//$code=htmlspecialchars($code,ENT_QUOTES);
	$enstr=array("\r\n","\r","\n",'"',"'","\t");
	$destr=array('','','','\"','\'','');
	$str=str_replace($enstr, $destr, $code);
	return $str;
}


/**
 * 将数据写入文件
 * Enter description here ...
 * @param unknown_type $data 要写入的数据
 * @param unknown_type $path 路径
 * @param unknown_type $fileName 文件名
 * @param unknown_type $auth 文件操作权限
 */
function writeToFile($data,$path,$fileName,$auth){
	$fp = fopen($path.$fileName , $auth);
	switch (gettype($data)){
		case 'array':
			fwrite($fp, print_r($data,true));
			break;
			
		default:
			fwrite($fp, $data);
			break;
	}
	fclose($fp);
}


//中文url编码
function zhUrlEncode($str) {
	if(is_array($str)) {  
        foreach($str as $key=>$value) {
		    $str[urlencode($key)] = zhUrlEncode($value);  
        }  
    } else {
    	//判断为中文才编码
    	if (preg_match("/([\x81-\xfe][\x40-\xfe])/", $str, $match)) {  
        	$str = urlencode($str);
    	}
    }  
    return $str;
}

function myJsonEncode($str) {
	return urldecode(json_encode(zhUrlEncode($str)));
}

/**
 * 生成树
 * @param unknown_type $arr 要遍历的数组
 * @param unknown_type $id_field ID字段名
 * @param unknown_type $son_field 欲生成的子列表名
 * @return array
 */
function generateTree($arr,$id_field='pk_id',$son_field='son'){
	foreach ($arr as $key=>$vlaue){
		$items[$key+1] = $vlaue;
	}
	
    foreach($items as $item){
        if(isset($items[$item['pid']])){
            $items[$item['pid']][$son_field][] = &$items[$item[$id_field]];
        }else{
            $tree[] = &$items[$item[$id_field]];
        }
    }
    return $tree;
}

/**
 * 把返回的数据集转换成Tree
 * @param array $list 要转换的数据集
 * @param string $pid parent 标记字段
 * @param string $level level 标记字段
 * @return array
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
function list_to_tree($list, $pk='pk_id', $pid = 'pid', $child = '_child', $root = 0) {
    // 创建Tree
    $tree = array();
    if(is_array($list)) {
        // 创建基于主键的数组引用
        $refer = array();
        foreach ($list as $key => $data) {
            $refer[$data[$pk]] =& $list[$key];
        }
        foreach ($list as $key => $data) {
            // 判断是否存在parent
            $parentId =  $data[$pid];
            if ($root == $parentId) {
                $tree[] =& $list[$key];
            }else{
                if (isset($refer[$parentId])) {
                    $parent =& $refer[$parentId];
                    $parent[$child][] =& $list[$key];
                }
            }
        }
    }
    return $tree;
}

/**
 * 遍历一个二维数组从中取出某个属性组成一位数组
 * @param $_array
 * @param $_string
 * @return array
 */
function tranArray($_array,$_string){
	$linshi = array();
	foreach ($_array as $k=>$v){
		$linshi[$k] = $_array[$k][$_string];
	}
	return $linshi;
}

/**
 * 创建管理员令牌
 * @param $info 用户信息
 * @return string
 */
function createAdminToken($info){
    session('admin_info',$info); //缓存用户信息
    $token = encrypt_my($info['pk_id']);
    cookie(md5(sha1('admin_token')),$token,86400*7); //保存身份令牌（默认7天）
    return $token;
}

//获取管理员令牌
function getAdminToken(){
    return cookie(md5(sha1('admin_token')));
}

//删除管理员令牌
function delAdminToken(){
    session('admin_info',null); //清除用户缓存
    cookie(md5(sha1('admin_token')),null);
}

/**
 * 获取管理员ID
 * @return mixed
 */
function getAdminId(){
    $info = session('admin_info');
    $aid = $info['pk_id'];
    if(!$aid){
        $token = getAdminToken();
        return !$token ? false : decrypt_my($token);
    }
    return $aid;
}

//获取管理员信息
function getAdminInfo(){
    return session('admin_info');
}

/**
 * 数据加密
 * @param $data
 * @param $key 秘钥
 * @return string
 */
function encrypt_my($data, $key='this_is_key') {
    $prep_code = serialize($data);
    $block = mcrypt_get_block_size('des', 'ecb');
    if (($pad = $block - (strlen($prep_code) % $block)) < $block) {
        $prep_code .= str_repeat(chr($pad), $pad);
    }
    $encrypt = mcrypt_encrypt(MCRYPT_DES, $key, $prep_code, MCRYPT_MODE_ECB);
    return base64_encode($encrypt);
}

/**
 * 数据解密
 * @param $str 加密串
 * @param $key 秘钥
 * @return mixed
 */
function decrypt_my($str, $key='this_is_key') {
    $str = base64_decode($str);
    $str = mcrypt_decrypt(MCRYPT_DES, $key, $str, MCRYPT_MODE_ECB);
    $block = mcrypt_get_block_size('des', 'ecb');
    $pad = ord($str[($len = strlen($str)) - 1]);
    if ($pad && $pad < $block && preg_match('/' . chr($pad) . '{' . $pad . '}$/', $str)) {
        $str = substr($str, 0, strlen($str) - $pad);
    }
    return unserialize($str);
}

/**
 * AES 加密 仅支持字符串、数组
 * @param $data 要加密的数据
 * @param string $key 秘钥
 * @param string $vi 向量
 * @param string $model 加密模式
 * @param string $cipher 位数
 * @return mixed
 */
function aes_encrypt($data,$key='',$vi='',$model='',$cipher=''){
    !$key && $key = 'thisismykey@12+.-$%^&#@<>';
    load('Common.aes');
    $aes = new \CryptAES();
    $key && $aes->set_key($key);
    $vi && $aes->set_iv($vi);
    $model && $aes->set_mode($model);
    $cipher && $aes->set_cipher($cipher);
    $str = $aes->encrypt($data);
    return $str;
}


/**
 * AES 解密
 * @param $data 要解密的数据
 * @param string $key 秘钥
 * @param string $vi 向量
 * @param string $model 加密模式
 * @param string $cipher 位数
 * @return mixed
 */
function aes_decrypt($data,$key='',$vi='',$model='',$cipher=''){
    !$key && $key = 'thisismykey@12+.-$%^&#@<>';
    load('Common.aes');
    $aes = new \CryptAES();
    $key && $aes->set_key($key);
    $vi && $aes->set_iv($vi);
    $model && $aes->set_mode($model);
    $cipher && $aes->set_cipher($cipher);
    $str = $aes->decrypt($data);
    return $str;
}


/**
 * 获取当前时间
 * @param string $format
 * @return bool|string
 */
function getNowTime($format='Y-m-d H:i:s'){
    return date($format);
}

/**
 * 上传文件，支持多传和单传
 * @param null $flow 文件流,多传留空,单传$_FILES['img']
 * @param $save_path 保存路径
 * @param null $type 限制类型
 * @param null $size 限制大小
 * @param string $root_path 保存根目录
 * @return array|string
 */
function UploadAll($flow=null,$save_path,$type=null,$size=null,$root_path='./Uploads/'){
    $config=array(
        'maxSize'=>$size==null?0:$size,
        'exts'=>$type==null?C('UPLOAD_TYPE'):$type,
        'rootPath'=>$root_path,
        'driver'=>'Local',
        'savePath'=>$save_path,
        'subName'=>'',
    );
    $upload= new \Think\Upload($config);
    if($flow==null){
        $return=$upload->upload();
    }else{
        $return=$upload->uploadOne($flow);
    }
    return is_array($return)?$return:$upload->getError();
}


?>